/*********************************************************************************************************
 *
 *	模块名称 :cp命令执行模块
 *	文件名称 :Cp_Command.c
 *	版    本 : V1.0
 *	说    明 :本模块在用户输入cp指令后开始执行。
 *
 *              注意事项：
 *                务必将编辑器的缩进参数和TAB设置为4来阅读本文件，以使得代码显示整齐。
 *
 *	修改记录 :
 *		版本号       日期         作者        说明
 *		V1.0     2022-05-09     zrx
 *
 *	Copyright (C), 2022-2030, xxxx
 *
 *********************************************************************************************************/

#include "../include/Cp_Command.h"

/*********************************************************************************************************
 *	函 数 名:Cp_Command
 *	功能说明:执行cp相关命令。
 *	形    参:string pointer array User content
 *  全局变量:无
 *	返 回 值:success 0    false -1
 *********************************************************************************************************/

int Cp_Command(char *abuf[20])
{
    if (abuf[1] && abuf[2]) //判断用户是否输入源和目标
    {
        char pbuf[128] = ""; //用于判断源是否带路径，带路径时将文件名拷贝出来
        char *p = "\0";
        int i = 0;
        while (*p != '/' && strcmp(p, abuf[1]))
        {
            p = *(abuf + 1) + strlen(abuf[1]) - 1 - i;
            ++i;
        }

        if (strcmp(p, abuf[1]))
        {
            strcpy(pbuf, abuf[1]);
        }

        if (!(*pbuf) && (!strcmp(abuf[2], ".") || !strcmp(abuf[2], "./"))) //判断目标与源（不带路径）是否为当前路径
        {
            printf("cp: \'%s\' and \'%s\' are the same file\n", abuf[1], abuf[1]);
            return -1;
        }
        else
        {
            char buf[128];
            getcwd(buf, 128);
            int cpcd = chdir(abuf[2]);

            if (cpcd == 0) //判断目标是否为路径
            {
                chdir(buf);

                if (p == abuf[1]) //判断源与目标，防止生成隐藏文件
                {
                    if (*(*(abuf + 2) + strlen(abuf[2]) - 1) == '/')
                    {
                        strcat(abuf[2], p);
                    }
                    else
                    {
                        strcat(abuf[2], "/");
                        strcat(abuf[2], p);
                    }
                }
                else
                {
                    if (*(*(abuf + 2) + strlen(abuf[2]) - 1) == '/')
                    {
                        p++;
                        strcat(abuf[2], p);
                    }
                    else
                    {
                        strcat(abuf[2], p);
                    }
                }
                if (!strcmp(abuf[2], abuf[1])) //判断目标与源（带路径）是否为当前路径
                {
                    printf("cp: \'%s\' and \'%s\' are the same file\n", abuf[1], abuf[1]);
                    return -1;
                }
            }
            else
            {
                printf("\'%s\': path does not exist\n", abuf[2]);
                return -1;
            }
        }

        FILE *fpsrc = fopen(abuf[1], "r");
        FILE *fpdest = fopen(abuf[2], "w");
        if (!fpsrc || !fpdest)
        {
            perror("fail fopen");
            return -1;
        }

        char *cbuf = (char *)calloc(1, 1024);
        size_t fr;
        while (fr = fread(cbuf, 1, 1024, fpsrc))
        {
            fwrite(cbuf, 1, fr, fpdest);
        }

        free(cbuf);
        cbuf = NULL;
        fclose(fpsrc);
        fclose(fpdest);

        return 0;
    }
    else
    {
        printf("invalid format\n");
        return -1;
    }
}